#include <typeinfo>
#include <typeindex>
#include <map>
#include <tuple>
#include <unordered_map>
#include <iostream>

using namespace std;

struct A
{
	using Type = A;
	virtual void show() { cout << typeid(Type).name() << endl; }
};

struct B : public A
{
	using Type = B;
	void show() override { cout << typeid(Type).name() << endl; }
};

template <size_t N>
struct C
{
	void show() { cout << "struct C<" << N << ">" << endl; }
};
constexpr size_t CIndex[] = { 1, 2, 3 };
std::tuple<int, double, char> Index;

int main()
{
	//for (size_t i = 0; i < 3; ++i)
	//{
	//	C<CIndex[i]>{}.show();
	//}
	A* pA1 = new B;
	//cout << std::type_index(typeid(*pA1)).name() << endl;
	cout << typeid(decltype(*pA1)).name() << endl;
	//pA1->show();

	//cout << typeid(C<std::type_index(typeid(*pA1)).hash_code()>{}).name() << endl;


	return 0;
}